#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=5000;
int G[MAXN][MAXN];
int c[MAXN];
int topo[MAXN];
int t;
int n;
bool dfs(int u){
    //c数组标记访问 1表示已访问过 0表示从未访问过 -1表示正在访问（dfs(u)正在栈帧中，尚未返回）
    c[u]=-1;
    for(int v=1;v<=n;v++){
        if(G[u][v]){
            //c[v]为-1 存在有向环
            if(c[v]<0){
                return false;
            }
            //先判断v能否访问，如果能访问如果dfs返回false，返回
            else if(!c[v] && !dfs(v)){
                return false;
            }
        }
    }
    //一轮搜索完毕，置为1
    c[u]=1;
    //
    topo[t++]=u;
    return true;
}
bool toposort(){
    t=0;
    memset(c,0,sizeof(c));
    //所有节点只要有一个存在有向环就退出
    for(int u=1;u<=n;u++){
        if(!c[u]){
            if(!dfs(u)){
                return false;
            }
        }
    }
    return true;
}
int main(void){
    //1-2 2-3 4-3 前面的优先于后面的
    G[2][1]=G[3][2]=G[3][4]=1;
    n=4;
    printf("%d\n",toposort());
    for(int i=0;i<=n;i++){
        printf("%d ",topo[i]);
    }
    printf("\n");
    return 0;
}
